use std::{net::{TcpListener,TcpStream},
        io::{prelude::*,BufReader,BufWriter},
        fs};
use hello::ThreadPool;
fn main() {
    /*
    线程池包含一组已生成的线程，它们时刻等待着接收并处理新的任务。
    当程序接收到新任务时，它会将线程池中的一个线程指派给该任务，
    在该线程忙着处理时，新来的任务会交给池中剩余的线程进行处理。
    最终，当执行任务的线程处理完后，它会被重新放入到线程池中，准备处理新任务。
     */
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    let pool = ThreadPool::new(4); /*  创建一个线程池，包含4个线程。
    使用编译器驱动的方式开发 ThreadPool
    创建 src/lib.rs 文件
    */
    for stream in listener.incoming().take(2) {
        /*只接受前两个请求。
        take 是迭代器 Iterator 上的方法，会限制后续的迭代进行最多两次，然后就结束监听，
        随后 ThreadPool 也将超出作用域并自动触发 drop
        */
        let stream = stream.unwrap();
        // 向线程池中提交任务
        pool.execute(move || {
            handle_connection(stream);
        });
    }
}
fn handle_connection(mut stream: TcpStream) {
    let mut buf_reader = BufReader::new(&mut stream);
    let request_line = buf_reader.lines().next().unwrap().unwrap();
    let (status_line, filename) = if request_line == "GET / HTTP/1.1" {
        ("HTTP/1.1 200 OK","hello.html")
    }else {
        ("HTTP/1.1 404 NOT FOUND","404.html")
    };
    let contents = fs::read_to_string(filename).unwrap();
    let length = contents.len();
    let response = format!("{}Content-Length: {}\r\n\r\n{}", status_line, length, contents);
    stream.write_all(response.as_bytes()).unwrap();
}
